const TerserPlguin = require("terser-webpack-plugin");
const CssMinimizerWebpackPlugin = require("css-minimizer-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const { PurgeCSSPlugin } = require("purgecss-webpack-plugin");
const glob = require("glob");
const path = require("path");
const webpack = require("webpack");
const CompressionPlugin = require("compression-webpack-plugin");

module.exports = {
  mode: "production",
  // mode: "development",
  devtool: false,
  optimization: {
    usedExports: true, // 在导入模块时，分析哪些模块可以使用(production自动开启)
    chunkIds: "deterministic",
    // runtime的代码是否抽取到单独的包中(早Vue2脚手架中)
    runtimeChunk: {
      name: "runtime",
    },
    splitChunks: {
      chunks: "all",
      minSize: 10,

      // 自己对需要进行拆包的内容进行分包
      cacheGroups: {
        utils: {
          test: /utils/,
          filename: "js/[id]_utils.js",
        },
        vendors: {
          // /node_modules/
          // window上面 /\
          // mac上面 /
          test: /[\\/]node_modules[\\/]/,
          filename: "js/[id]_vendors.js",
        },
      },
    },
    minimize: true, // 告之webpack 使用terser
    minimizer: [
      // js 压缩配置
      new TerserPlguin({
        extractComments: true, // 是否提取注释
        parallel: true, // 使用多进程并发提高构建
        terserOptions: {
          compress: {
            // 设置压缩相关配置
            arguments: true,
            unsafe: true,
          },
          mangle: true, // 是否丑化
          // toplevel: false, // 顶层变量是否转换
          keep_fnames: true, // 是否保留函数名称
        },
      }),
      // css 压缩配置
      // new CssMinimizerWebpackPlugin({
      //   parallel: true,
      // }),
    ],
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: "css/[name].css",
      chunkFilename: "css/[name]_chunk.css",
    }),
    // css tree shaking
    // new PurgeCSSPlugin({
    //   paths: glob.sync(`${path.resolve(__dirname, "./src")}/**/*`, {
    //     nodir: true, // 不查找文件夹
    //   }),
    //   safelist: function () {
    //     return {
    //       standard: ["body"],
    //     };
    //   },
    // }),
    // 作用域提升
    new webpack.optimize.ModuleConcatenationPlugin(),
    // 代码压缩
    new CompressionPlugin({
      test: /\.(js|css)$/, // 匹配哪些文件需要压缩
      // threshold: 500,    // 设置文件从多大开始压缩
      // minRatio: 0.7, // 至少压缩比
      algorithm: "gzip", // 采用那种压缩算法
    }),
  ],
};
